package com.kzw.core.util;


import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.collection.PersistentBag;
import org.hibernate.proxy.map.MapProxy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.kzw.core.json.SqlTimestampConverter;

import flexjson.JSONSerializer;
import flexjson.transformer.DateTransformer;

public class JsonUtil {
	private static Log logger=LogFactory.getLog(JsonUtil.class);
	
	/**
	 * 取得json的格式化器，用JSONSerializer可以解决延迟加载的问题
	 * @param dateFields　日期字段
	 * @return
	 */
	public static JSONSerializer getJSONSerializer(String...dateFields){
		JSONSerializer serializer=new JSONSerializer();
		serializer.exclude("*.class");
		serializer.transform(new DateTransformer("yyyy-MM-dd HH:mm:ss"), dateFields);
		return serializer;
	}
	
	public static JSONSerializer getJSONSerializer(){
		JSONSerializer serializer=new JSONSerializer();
		serializer.exclude("*.class");
		serializer.transform(new DateTransformer("yyyy-MM-dd HH:mm:ss"), Date.class);
		return serializer;
	}
	
	/**
	 * Map to json string
	 * @param map
	 * @return
	 */
	/**
	 * gson 格式化数据列表
	 * @param datas 数据列表
	 * @param gson Gson对象
	 * @param type 元数据类型
	 * @param fields 延迟加载的字段
	 * @return
	 */
	public static String jsonSerilize(List datas,Gson gson,Type type,String ...fields){
		//触发get方法以使得外键实体能获取以方便不需要的外键映射
		if(fields!=null){
			for(Object obj:datas){
				for(String field:fields){
					String methodName="get"+FunctionsUtil.makeFirstLetterUpperCase(field);
					try{
						Method getMethod=obj.getClass().getMethod(methodName,null);
						getMethod.invoke(obj, null);
					}catch(Exception ex){
						logger.error(ex.getMessage());
					}
				}
			}
		}
		return gson.toJson(datas, type);
	}
	
	/**
	 * 取得通用的Gson格式化，如日期格式 yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static Gson getGson(){
		GsonBuilder builder=new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss");
		builder.registerTypeAdapter(Timestamp.class, new SqlTimestampConverter());
		Gson gson=builder.create();
		return gson;
	}
}
